package top.jiangqiang.qyblog.core.init;

import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.jdbc.ScriptRunner;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.Connection;

/**
 * 项目启动后使用指定的dataSource自动执行sql脚本，如果有多个数据源可以通过注入多个数据源对应的IDdl实现
 *
 * @author Jiangqiang
 * @version 1.0
 * @date 2023/4/26 10:12
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class InitCacheTable implements ApplicationRunner {
    private final DataSource dataSource;
    private final DataSourceProperties dataSourceProperties;

    public static void runScript(DataSource dataSource, String sqlStr) {
        if (StrUtil.isBlank(sqlStr)) {
            return;
        }
        try (
                Connection connection = dataSource.getConnection();
                ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(sqlStr.getBytes());
                Reader reader = new InputStreamReader(byteArrayInputStream);
        ) {
            // 执行 SQL 脚本
            log.debug("run script start: {}", sqlStr);
            ScriptRunner scriptRunner = new ScriptRunner(connection);
            scriptRunner.setAutoCommit(true);
            scriptRunner.setStopOnError(true);
            scriptRunner.runScript(reader);
            log.debug("run script end");
        } catch (Exception e) {
            log.error("run script error: {}", e.getMessage());
        }
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
//        //数据库中已经创建的表名
//        List<String> tables = MetaUtil.getTables(dataSource);
//        if (!tables.contains(tableName)) {
//            log.debug("自动创建缓存表：{}", tableName);
//            //表不存在 创建表
//            //获取数据库名称
//            String db = JdbcUtils.getDbType(dataSourceProperties.getUrl()).getDb();
//            //根据数据库类型选择脚本文件
//            URL sqlResource = ResourceUtil.getResource("init/schema-cache-" + db + ".sql");
//            if (sqlResource != null) {
//                log.debug("初始化缓存表使用的脚本文件：{}", "schema-cache-" + db + ".sql");
//                //脚本存在
//                String ddlSql = FileUtil.readString(sqlResource, StandardCharsets.UTF_8);
//                if (StrUtil.isNotBlank(ddlSql)) {
//                    runScript(dataSource, ddlSql);
//                }
//            } else {
//                //如果指定数据库类型的脚本文件不存在，则使用通用的脚本文件
//                sqlResource = ResourceUtil.getResource("init/schema-cache.sql");
//                if (sqlResource != null) {
//                    log.debug("初始化缓存表使用的脚本文件：{}", "schema-cache.sql");
//                    //脚本存在
//                    String ddlSql = FileUtil.readString(sqlResource, StandardCharsets.UTF_8);
//                    if (StrUtil.isNotBlank(ddlSql)) {
//                        runScript(dataSource, ddlSql);
//                    }
//                } else {
//                    throw new JsonException("初始化缓存表使用的脚本文件不存在");
//                }
//            }
//        }
    }
}
